/* C++的引用  指针和引用的区别?
 * 1、左值引用和右值引用
 * 2、引用的实例
 *
 * 引用是一种更安全的指针。
 * 1、引用必须初始化，指针可以不初始化。
 * 2、引用只有一级引用，没有多级引用；指针可以有一级指针，也可以有多级指针。
 * 3、定义一个引用变量，和定义一个指针变量，其汇编指令是一模一样的；
 *    通过引用变量修改所引用内存的值，和通过指针解引用修改指针指向的内存的值，其底层指令也是一样的。
 *
 * 右值引用：
 * 1、 int &&c=20;
 *   专门用来引用右值类型，指令上，可以自动产生临时量然后直接引用临时量 c=40;
 * 2、右值引用本身是一个左值，只能用左值引用来引用它
 * 3、不能用右值引用变量来引用一个左值
 *
 * int &p=a;   相当于     int *p=&a;
 * 
 * */

#include <iostream>
using namespace std;
void swap1(int *a,int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
}
void swap2(int &a,int &b){
    int temp=a;
    a=b;
    b=temp;
}

int main(){
    int a=10;       //左值，它有内存，有名字，值可以修改
    int &b=a;

    //C++11提供右值引用
    int &&c=20;

    //int &d=10;       错误！！
    const int &d=10;


    /*
    int arr[5]={};
    int *p=arr;

    //定义引用变量来引用数组arr
    int (&q)[5]=arr;

    cout<<sizeof(arr)<<endl;    //20
    cout<< sizeof(p)<<endl;     //8     在大多数现代64位系统中，指针的大小是8字节
    cout<< sizeof(q)<<endl;     //20
    */


    /*
    int x=1;
    int y=2;
    swap1(&x,&y);
    cout<<"swap1: x= "<<x<<" y= "<<y<<endl;

    swap2(x,y);
    cout<<"swap2: x= "<<x<<" y= "<<y<<endl;
    */

    /*
    int a=10;
    int *p=&a;
    int &b=a;
    cout<<*p<<endl;
    cout<<b<<endl;

    b=30;
    cout<<*p<<endl;
    cout<<b<<endl;
    */
    return 0;
}
